home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Merciful 5
/
Merciful - Disc 5.iso
/
software
/
p
/
pcqpascalv1.2d.lha
/
Examples2
/
cal
/
cal.p
< prev
next >
Wrap
Text File
|
1997-05-06
|
24KB
|
899 lines
Program Cal_v20;
{
cal v2.0
© 1995 by Andreas Tetzl
FREEWARE
}
{ /// ------------------------------ "Includes" ------------------------------ }
{$I "Include:Utility/Utility.i"}
{$I "Include:Utility/Date.i"}
{$I "Include:Exec/Libraries.i"}
{$I "Include:Exec/Memory.i"}
{$I "Include:Exec/Lists.i"}
{$I "Include:Exec/Nodes.i"}
{$I "Include:Exec/Tasks.i"}
{$I "Include:Libraries/Locale.i"}
{$I "Include:Utils/TimerUtils.i"}
{$I "Include:Utils/StringLib.i"}
{$I "Include:Utils/Parameters.i"}
{$I "Include:Utils/Break.i"}
{$I "Include:DOS/DOSExtens.i"}
{$I "Include:DOS/RDArgs.i"}
{ /// ------------------------------------------------------------------------ }
{ /// -------------------------------- "VAR" --------------------------------- }
Type DateStruct = Record
succ, pred : ^DateStruct;
day, month, year, color, bcolor : Integer;
bold, italics, underlined : Boolean;
end;
DateStructPtr = ^DateStruct;
const spaces = " ";
version = "$VER: cal v2.0 (05-Nov-95) by Andreas Tetzl";
configfilename : Array[0..2] of String = (NIL,"cal.dates","s:cal.dates");
VAR Timer : TimeRequestPtr;
TV : TimeVal;
CD : ClockData;
amigadate, i, j : Integer;
mday : String;
Str : Array[1..9] of String;
posadd : Array[1..9] of Integer;
month, year : Integer;
SUNDAY_LAST, WHOLE_YEAR : Boolean;
Dates : ListPtr;
{ Strings }
wdays_sunday_first,
wdays_sunday_last : String;
mon : Array[1..12] of String;
badnumber : String;
{ /// ------------------------------------------------------------------------ }
{ /// ----------------------- "FUNCTION My_NameFromFH" ----------------------- }
FUNCTION My_NameFromFH(a1, a2 : Address; a3 : Integer) : Boolean;
BEGIN
{$A
XREF _p%DOSBase
move.l _p%DOSBase,a6
move.l 4(sp),d3
move.l 8(sp),d2
move.l 12(sp),d1
jsr -408(a6)
}
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "FUNCTION My_GetVar" ------------------------- }
FUNCTION My_GetVar(name, buf : Address; len, flags : Integer) : Integer;
BEGIN
{$A
XREF _p%DOSBase
move.l 4(sp),d4
move.l 8(sp),d3
move.l 12(sp),d2
move.l 16(sp),d1
move.l _p%DOSBase,a6
jsr -906(a6)
}
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "PROCEDURE FreeList" ------------------------- }
PROCEDURE FreeList(L : ListPtr);
{ free the list }
VAR MyNode, ThisNode : DateStructPtr;
BEGIN
MyNode:=DateStructPtr(L^.lh_head);
While MyNode^.succ<>NIL do
BEGIN
ThisNode:=MyNode;
MyNode:=MyNode^.succ;
Dispose(ThisNode);
END;
Dispose(L);
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------ "PROCEDURE CleanExit" ------------------------- }
PROCEDURE CleanExit(Why : String; RC : Integer);
BEGIN
FreeList(Dates);
If Timer<>NIL then DeleteTimer(Timer);
If UtilityBase<>NIL then CloseLibrary(UtilityBase);
If Why<>NIL then Writeln(Why);
Exit(RC);
END;
{ /// ------------------------------------------------------------------------ }
{ /// --------------------------- "FUNCTION leap" ---------------------------- }
FUNCTION leap(year : Integer) : Boolean;
{ TRUE for leap year, FALSE otherwise }
BEGIN
if (year mod 4=0) and NOT((year>1582) and (year mod 100=0) and (year mod 400<>0)) then
leap:=TRUE
else
leap:=FALSE;
END;
{ /// ------------------------------------------------------------------------ }
{ /// --------------------------- "FUNCTION days" ---------------------------- }
FUNCTION days(year, month : Integer) : Integer;
{ return number of days in the given month }
const day : Array[1..12] of Integer = (
31,28,31,30,31,30,
31,31,30,31,30,31);
BEGIN
if (month=2) and (leap(year)) then days:=day[month]+1
else days:=day[month];
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "FUNCTION AddNode" -------------------------- }
FUNCTION AddNode(day, month, year, color, bcolor : Integer; bold, italics, underl : Boolean) : Boolean;
{ add an element to the list of dates to be highlighted }
VAR MyNode : DateStructPtr;
BEGIN
{
Writeln(year,"-",month,"-",day);
Writeln(color," ",Integer(bold)," ",Integer(italics)," ",Integer(underl));
Writeln;
}
if (year>3000) or (month>12) or (day>days(year,month)) or (day<1) then AddNode:=FALSE;
if (year=1582) and (month=10) and (day>4) and (day<15) then AddNode:=FALSE;
New(MyNode);
MyNode^.day:=day;
MyNode^.month:=month;
MyNode^.year:=year;
MyNode^.color:=color;
MyNode^.bcolor:=bcolor;
MyNode^.bold:=bold;
MyNode^.italics:=italics;
MyNode^.underlined:=underl;
AddTail(Dates,NodePtr(MyNode));
AddNode:=TRUE;
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------ "PROCEDURE ReadConfig" ------------------------ }
PROCEDURE ReadConfig;
{ parse s:cal.dates
call AddNode for each entry }
VAR FH : FileHandle;
line, Str : String;
c, c2 : Char;
i, j, l : Integer;
year, month, day, color, bcolor : Integer;
bold, italics, underl : Boolean;
BEGIN
l:=0;
line:=AllocString(100);
Str:=AllocString(100);
FH:=NIL;
if NOT StrEq(configfilename[0],"") then FH:=DOSOpen(configfilename[0],MODE_OLDFILE);
if FH=NIL then FH:=DOSOpen(configfilename[1],MODE_OLDFILE);
if FH=NIL then FH:=DOSOpen(configfilename[2],MODE_OLDFILE);
if FH=NIL then Return;
While FGets(FH,line,100)<>NIL do
BEGIN
Inc(l);
i:=0;
While isspace(line[i]) do Inc(i);
if (line[0]<>'\0') and (line[0]<>'\n') and (line[0]<>';') and (line[i]<>';') then
BEGIN
bold:=FALSE; italics:=FALSE; underl:=FALSE; color:=-1; bcolor:=-1;
year:=0; month:=0; day:=0;
i:=0;
While isspace(line[i]) do Inc(i);
if (isdigit(line[i])) or (line[i]='?') then { detected a date }
BEGIN
StrCpy(Str,"");
While (isdigit(line[i])) or (line[i]='?') do
BEGIN
StrnCat(Str,adr(line[i]),1); { copy year }
Inc(i);
END;
j:=StrToLong(Str,adr(year));
Inc(i); { - or / }
StrCpy(Str,"");
While (isdigit(line[i])) or (line[i]='?') do
BEGIN
StrnCat(Str,adr(line[i]),1); { copy month }
Inc(i);
END;
j:=StrToLong(Str,adr(month));
Inc(i); { - or / }
StrCpy(Str,"");
While isdigit(line[i]) do { don't allow '?' for day }
BEGIN
StrnCat(Str,adr(line[i]),1); { copy day }
Inc(i);
END;
j:=StrToLong(Str,adr(day));
END;
Dec(i);
Repeat
Inc(i);
While isspace(line[i]) do Inc(i);
c:=line[i]; c2:=line[i+1];
While isalnum(line[i]) do Inc(i);
Case toupper(c) of
'B' : bold:=TRUE;
'I' : italics:=TRUE;
'U' : underl:=TRUE;
'C' : color:=ord(c2)-48;
'R' : bcolor:=ord(c2)-48;
END;
Until (line[i]='\n') or (line[i]='\0') or (line[i]=';');
if ((day=0) and (month=0) and (year=0)) or
((color=-1) and (bcolor=-1) and (bold=FALSE) and (italics=FALSE) and (underl=FALSE)) then
BEGIN
If My_NameFromFH(FH,Str,100) then;
DOSClose(FH);
Writeln("syntax error in line ",l," of ",Str);
FreeList(Dates);
New(Dates);
NewList(Dates); { create empty list }
Return;
END
ELSE
if NOT AddNode(day,month,year,color,bcolor,bold,italics,underl) then
BEGIN
If My_NameFromFH(FH,Str,100) then;
DOSClose(FH);
Writeln("invalid date in line ",l," of ",Str);
FreeList(Dates);
New(Dates);
NewList(Dates); { create empty list }
Return;
END;
END;
END;
DOSClose(FH);
END;
{ /// ------------------------------------------------------------------------ }
{ /// -------------------------- "PROCEDURE ReadENV" -------------------------- }
PROCEDURE ReadENV;
{ read ENV:SUNDAY_LAST
if it does'nt exists, don't change the boolean var
}
VAR Str : String;
Mypr : ProcessPtr;
OldWin : Address;
BEGIN
Str:=AllocString(10);
MyPr:=ProcessPtr(FindTask(NIL));
OldWin:=MyPr^.pr_WindowPtr;
MyPr^.pr_WindowPtr:=address(-1); { disable "please insert" requesters }
if My_GetVar("SUNDAY_LAST",Str,2,0)<>-1 then
if Str[0]='1' then SUNDAY_LAST:=TRUE
else SUNDAY_LAST:=FALSE;
MyPr^.pr_WindowPtr:=OldWin; { allow error requesters }
end;
{ /// ------------------------------------------------------------------------ }
{ /// ----------------------- "PROCEDURE Init" ------------------------ }
PROCEDURE Init;
{ initialize all strings, use locale.library if possible }
VAR i : Integer;
loc : LocalePtr;
cat : CatalogPtr;
Str : String;
BEGIN
Str:=AllocString(30);
wdays_sunday_first:=AllocString(20);
wdays_sunday_last:=AllocString(20);
badnumber:=AllocString(30);
configfilename[0]:=AllocString(200);
For i:=1 to 12 do
mon[i]:=AllocString(20);
StrCpy(wdays_sunday_first,"Su Mo Tu We Th Fr Sa");
StrCpy(wdays_sunday_last,"Mo Tu We Th Fr Sa Su");
StrCpy(mon[1],"January");
StrCpy(mon[2],"February");
StrCpy(mon[3],"March");
StrCpy(mon[4],"April");
StrCpy(mon[5],"May");
StrCpy(mon[6],"June");
StrCpy(mon[7],"July");
StrCpy(mon[8],"August");
StrCpy(mon[9],"September");
StrCpy(mon[10],"October");
StrCpy(mon[11],"November");
StrCpy(mon[12],"December");
StrCpy(badnumber,"bad number");
LocaleBase:=OpenLibrary("locale.library",38);
if LocaleBase=NIL then Return;
loc:=OpenLocale(NIL);
if loc=NIL then
BEGIN
CloseLibrary(localebase);
Return;
END;
If loc^.loc_CalendarType=CT_7MON then SUNDAY_LAST:=TRUE else SUNDAY_LAST:=FALSE;
StrnCpy(wdays_sunday_first,GetLocaleStr(loc,ABDAY_1),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_2),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_3),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_4),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_5),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_6),2);
StrCat(wdays_sunday_first," ");
StrnCat(wdays_sunday_first,GetLocaleStr(loc,ABDAY_7),2);
StrCat(wdays_sunday_first," ");
StrnCpy(wdays_sunday_last,GetLocaleStr(loc,ABDAY_2),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_3),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_4),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_5),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_6),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_7),2);
StrCat(wdays_sunday_last," ");
StrnCat(wdays_sunday_last,GetLocaleStr(loc,ABDAY_1),2);
StrCat(wdays_sunday_last," ");
StrCpy(mon[1],GetLocaleStr(loc,MON_1));
StrCpy(mon[2],GetLocaleStr(loc,MON_2));
StrCpy(mon[3],GetLocaleStr(loc,MON_3));
StrCpy(mon[4],GetLocaleStr(loc,MON_4));
StrCpy(mon[5],GetLocaleStr(loc,MON_5));
StrCpy(mon[6],GetLocaleStr(loc,MON_6));
StrCpy(mon[7],GetLocaleStr(loc,MON_7));
StrCpy(mon[8],GetLocaleStr(loc,MON_8));
StrCpy(mon[9],GetLocaleStr(loc,MON_9));
StrCpy(mon[10],GetLocaleStr(loc,MON_10));
StrCpy(mon[11],GetLocaleStr(loc,MON_11));
StrCpy(mon[12],GetLocaleStr(loc,MON_12));
cat:=OpenCatalogA(loc,"sys/dos.catalog",NIL);
if cat<>NIL then
BEGIN
badnumber:=GetCatalogStr(cat,115,"bad number"); { get localized "bad number" from dos.catalog }
CloseCatalog(cat);
END;
CloseLocale(loc);
CloseLibrary(LocaleBase);
END;
{ /// ------------------------------------------------------------------------ }
{ /// ----------------------- "PROCEDURE InsertString" ----------------------- }
PROCEDURE InsertString(s, ins : String; pos, l : Integer);
{ insert a string into another one at the given position
}
VAR Str : String;
i, j : Integer;
BEGIN
j:=0;
For i:=0 to Strlen(s) do
BEGIN
if s[i]='\e' then
BEGIN
if (s[i+2]='0') and (s[i+3]='m') then Inc(pos,4)
else
if (s[i+2]='1') and (s[i+3]='m') then Inc(pos,4)
else
if (s[i+2]='3') and (s[i+3]='m') then Inc(pos,4)
else
if (s[i+2]='4') and (s[i+3]='m') then Inc(pos,4)
else
if (s[i+2]='3') and (isdigit(s[i+3])) and (s[i+4]='m') then Inc(pos,5)
else
if (s[i+2]='4') and (isdigit(s[i+3])) and (s[i+4]='m') then Inc(pos,5);
END;
END;
Str:=AllocString(255);
if pos>0 then StrnCpy(Str,s,pos);
StrCat(Str,ins);
StrCat(Str,adr(s[pos]));
StrCpy(s,spaces);
StrCpy(s,Str);
FreeString(Str);
posadd[l]:=0;
For i:=0 to Strlen(s) do
BEGIN
if s[i]='\e' then
BEGIN
if (s[i+2]='0') and (s[i+3]='m') then Inc(posadd[l],4)
else
if (s[i+2]='1') and (s[i+3]='m') then Inc(posadd[l],4)
else
if (s[i+2]='3') and (s[i+3]='m') then Inc(posadd[l],4)
else
if (s[i+2]='4') and (s[i+3]='m') then Inc(posadd[l],4)
else
if (s[i+2]='3') and (isdigit(s[i+3])) and (s[i+4]='m') then Inc(posadd[l],5)
else
if (s[i+2]='4') and (isdigit(s[i+3])) and (s[i+4]='m') then Inc(posadd[l],5);
END;
END;
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------ "PROCEDURE Highlight" ------------------------- }
PROCEDURE Highlight(s : String; d : DateStructPtr; l : Integer);
{ interprete highlighting-list-entry and insert ansi-sequence }
const
Bold = "\e[1m";
Italics = "\e[3m";
Underl = "\e[4m";
VAR ESC, Str : String;
BEGIN
ESC:=AllocString(255);
Str:=AllocString(10);
StrCpy(ESC,"");
if d^.bold then StrCat(ESC,Bold);
if d^.italics then StrCat(ESC,Italics);
if d^.underlined then StrCat(ESC,Underl);
if d^.color<>-1 then
BEGIN
StrCat(ESC,"\e[3");
i:=IntToStr(Str,d^.color);
StrCat(ESC,Str);
StrCat(ESC,"m");
END;
if d^.bcolor<>-1 then
BEGIN
StrCat(ESC,"\e[4");
i:=IntToStr(Str,d^.bcolor);
StrCat(ESC,Str);
StrCat(ESC,"m");
END;
StrCpy(s,ESC);
END;
{ /// ------------------------------------------------------------------------ }
{ /// ----------------------- "FUNCTION My_Date2Amiga" ------------------------ }
FUNCTION My_Date2Amiga(date : ClockDataPtr) : Integer;
{ calculate days (!) from 1-Jan-1 to the given date }
const days : Array[1..12] of Integer = (
31,28,31,30,31,30,
31,31,30,31,30,31);
years : Array[0..59] of Integer =
(0, 18262, 36525, 54787, 73050, 91312, 109575, 127837, 146100,
164362, 182625, 200887, 219150, 237412, 255675, 273937, 292200,
310462, 328725, 346987, 365250, 383512, 401775, 420037, 438300,
456562, 474825, 493087, 511350, 529612, 547875, 566137, 584389,
602651, 620913, 639175, 657437, 675699, 693961, 712223, 730486,
748748, 767010, 785272, 803534, 821796, 840058, 858320, 876583,
894845, 913107, 931369, 949631, 967893, 986155, 1004417, 1022680,
1040942, 1059204, 1077466);
VAR amigatime, i, j, l, y : Integer;
BEGIN
y:=(date^.year div 50)*50;
if date^.year div 50=date^.year/50 then Dec(y,50);
amigatime:=years[y div 50];
For i:=y+1 to date^.year-1 do
BEGIN
if (i=1582) then Dec(amigatime,11); { julian -> gregorian calendar }
if leap(i) then Inc(amigatime,366)
else Inc(amigatime,365);
END;
For i:=1 to date^.month-1 do
BEGIN
l:=days[i];
if (i=2) and (leap(date^.year)) then Inc(l,1);
For j:=1 to l do
Inc(amigatime,1);
END;
For i:=1 to date^.mday-1 do Inc(amigatime,1);
My_Date2Amiga:=amigatime;
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "FUNCTION Shiftwday" ------------------------- }
FUNCTION Shiftwday(wday, pos : Integer) : Integer;
{ rotate weekday
Saturday->Sunday
Sunday->Monday
...
}
VAR i : Integer;
BEGIN
if pos=0 then Shiftwday:=wday;
If pos>0 then
For i:=1 to pos do
BEGIN
Inc(wday);
if wday=7 then wday:=0;
END
else
For i:=-1 downto pos do
BEGIN
Dec(wday);
if wday=-1 then wday:=6;
END;
Shiftwday:=wday;
END;
{ /// ------------------------------------------------------------------------ }
{ /// -------------------------- "FUNCTION weekday" -------------------------- }
FUNCTION weekday(year, month, day : Integer) : Integer;
{ return the weekday of the given date }
VAR CD : ClockData;
wday : Integer;
BEGIN
if amigadate=0 then
BEGIN
CD.year:=year;
CD.month:=month;
CD.mday:=day;
amigadate:=My_Date2Amiga(adr(CD));
END
ELSE Inc(amigadate);
if (year<1582) or ((year=1582) and (month<10)) or ((year=1582) and (month=10) and (day<=4)) then
wday:=((amigadate+6) mod 7)
else
wday:=((amigadate-7) mod 7);
{ julian -> gregorian }
if (year=1582) and (month=10) and (day>=5) and (day<15) then
wday:=5;
if (year=1582) and (((month=10) and (day>14)) or (month>10)) then wday:=Shiftwday(wday,3);
weekday:=wday;
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "FUNCTION DateMatch" ------------------------- }
FUNCTION DateMatch(year, month, day : Integer) : DateStructPtr;
{ parse hightlighting-list and return entry-ptr if match }
VAR d : DateStructPtr;
BEGIN
d:=DateStructPtr(dates^.lh_head);
While d^.succ<>NIL do
BEGIN
if ((d^.year=0) or (year=d^.year)) and
((d^.month=0) or (month=d^.month)) and
(day=d^.day) then DateMatch:=d;
d:=d^.succ;
END;
DateMatch:=NIL;
END;
{ /// ------------------------------------------------------------------------ }
{ /// --------------------- "PROCEDURE Cal" ------------------------------- }
PROCEDURE Cal(x : WORD);
{ create calendar with sunday last }
VAR l, j, i, k, n, wday : Integer;
y, s, s2 : String;
MyDS : DateStructPtr;
BEGIN
amigadate:=0;
y:=AllocString(40);
s:=AllocString(40);
s2:=AllocString(40);
For i:=1 to 9 do
For j:=0 to x+19 do
if Str[i][j]='\0' then Str[i][j]:=' ';
StrCpy(y,"");
For i:=1 to 7-(StrLen(mon[CD.month]) div 2) do StrCat(y," ");
If WHOLE_YEAR=TRUE then StrCat(y," ");
StrCpy(adr(Str[1][x]),y);
StrCat(Str[1],mon[CD.month]);
StrCat(Str[1]," ");
i:=IntToStr(y,CD.year);
if WHOLE_YEAR=FALSE then StrCat(Str[1],y);
If SUNDAY_LAST then
StrCpy(adr(Str[2][x]),wdays_sunday_last)
else
StrCpy(adr(Str[2][x]),wdays_sunday_first);
l:=3;
CD.mday:=1;
For k:=1 to days(CD.year,CD.month) do
BEGIN
i:=IntToStr(mday,CD.mday);
if Strlen(mday)=1 then
BEGIN
mday[1]:=mday[0];
mday[0]:='0';
mday[2]:='\0';
END;
wday:=weekday(CD.year,CD.month,CD.mday);
MyDS:=DateMatch(CD.year,CD.month,CD.mday);
If SUNDAY_LAST=TRUE then
Case wday of
1 : n:=0;
2 : n:=3;
3 : n:=6;
4 : n:=9;
5 : n:=12;
6 : n:=15;
0 : n:=18;
end
else
Case wday of
0 : n:=0;
1 : n:=3;
2 : n:=6;
3 : n:=9;
4 : n:=12;
5 : n:=15;
6 : n:=18;
end;
If MyDS<>NIL then
BEGIN
StrCpy(s," \0");
StrCpy(s2,"");
s[1]:=mday[1];
if mday[0]<>'0' then s[0]:=mday[0];
Highlight(s2,MyDS,l);
StrCat(s2,s);
StrCat(s2,"\e[0m");
InsertString(Str[l],s2,x+n,l);
END
ELSE
BEGIN
Str[l][x+posadd[l]+n+1]:=mday[1];
if mday[0]<>'0' then Str[l][x+posadd[l]+n]:=mday[0];
END;
if ((SUNDAY_LAST=TRUE) and (wday=0)) or
((SUNDAY_LAST=FALSE) and (wday=6)) then Inc(l);
Inc(CD.mday);
end;
Inc(CD.month);
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "PROCEDURE Cal_YEAR" ------------------------- }
PROCEDURE Cal_YEAR;
{ create a calendar for a whole year }
VAR j, i : Integer;
BEGIN
CD.month:=1;
For j:=1 to 4 do
BEGIN
For i:=1 to 9 do
BEGIN
StrCpy(Str[i]," ");
posadd[i]:=0;
END;
Cal(0); Cal(23); Cal(46);
For i:=1 to 9 do
BEGIN
j:=Strlen(Str[i])-1;
While isspace(Str[i][j]) do
BEGIN { cut spaces }
Str[i][j]:='\0';
Dec(j);
END;
if StrLen(Str[i])>0 then Writeln(Str[i]);
If CheckBreak then CleanExit("*** break",0);
END;
Writeln;
END;
END;
{ /// ------------------------------------------------------------------------ }
{ /// ------------------------- "PROCEDURE GetArgs" -------------------------- }
PROCEDURE GetArgs;
{ read arguments from command line }
const template = "MONTH/N,YEAR/N,Y/S,DATES/K";
ExtHelp = "\ncal v2.0 © 1995 by Andreas Tetzl\n\nMONTH : specify month of year (1..12, default: current month)\nYEAR : specify year (1..3000, default: current year)\nY : show calendar of a whole year (default: off)\nDATES : specify config-filename (default: s:cal.dates)\n\n";
VAR rda : RDArgsPtr;
vec : Array[0..3] of Address;
BEGIN
vec[0]:=NIL;
vec[1]:=NIL;
vec[2]:=NIL;
vec[3]:=NIL;
rda:=AllocDosObject(DOS_RDARGS,NIL);
if rda=NIL then CleanExit(NIL,20);
rda^.RDA_ExtHelp:=ExtHelp;
if ReadArgs(template,adr(vec),rda)=NIL then
BEGIN
If Printfault(IoErr,NIL) then;
FreeDosObject(DOS_RDARGS,rda);
CleanExit(NIL,0);
END;
year:=0;
month:=0;
if vec[0]<>NIL then CopyMem(vec[0],adr(month),4);
if vec[1]<>NIL then CopyMem(vec[1],adr(year),4);
WHOLE_YEAR:=Boolean(vec[2]);
if vec[3]<>NIL then StrCpy(configfilename[0],vec[3]);
FreeArgs(rda);
FreeDosObject(DOS_RDARGS,rda);
if year=-1 then year:=-2;
if month=-1 then month:=-2;
if (WHOLE_YEAR) and (year=0) then
BEGIN
year:=month;
month:=-1;
END;
if (year=0) and (month>13) then
BEGIN
year:=month;
month:=-1;
WHOLE_YEAR:=TRUE;
END;
if year=0 then year:=-1;
if month=0 then month:=-1;
END;
{ /// ------------------------------------------------------------------------ }
{ /// -------------------------------- "Main" -------------------------------- }
BEGIN
For i:=1 to 9 do Str[i]:=AllocString(1000);
mday:=AllocString(10);
New(Dates);
NewList(Dates);
UtilityBase:=OpenLibrary("utility.library",37);
if UtilityBase=NIL then CleanExit("this program needs Kickstart 2.0 V37+",10);
Timer:=CreateTimer(UNIT_VBLANK);
If Timer=NIL then CleanExit("could not open timer.device",10);
Init;
GetArgs;
ReadENV; { if env-variable exists, overwrite locale settings }
GetSysTime(Timer,TV);
Amiga2Date(TV.tv_Secs,adr(CD));
if ((month<>-1) and (month<1)) or (month>12) or ((year<1) and (year<>-1)) or (year>3000) then
CleanExit(badnumber,10);
ReadConfig;
if year<>-1 then CD.year:=year;
if month<>-1 then CD.month:=month;
if WHOLE_YEAR then
BEGIN
Writeln(" ",CD.year,"\n");
Cal_YEAR;
END
else
BEGIN
Cal(0);
For i:=1 to 9 do
BEGIN
j:=Strlen(Str[i])-1;
While isspace(Str[i][j]) do
BEGIN { cut spaces }
Str[i][j]:='\0';
Dec(j);
END;
if Strlen(Str[i])>0 then Writeln(Str[i]);
If CheckBreak then CleanExit("*** break",0);
END;
Writeln;
END;
CleanExit(NIL,0);
END.
{ /// ------------------------------------------------------------------------ }